# coding=utf-8
from common.utils.types import Enum
from common.lottery import LOTTERY_TYPE
from common import orm

TC_THREE_BET_CATEGORY = Enum({
    'THREE': (3L, u'三星玩法'),
    'TWO': (2L, u'二星玩法'),
})

BET_TYPE = Enum({
    'DIRECT_3': (301L, u'三星直选'),
    'SUM_3': (302L, u'三星直选和值'),

    'GROUP_3': (303L, u'三星组三'),
    'GROUP_6': (304L, u'三星组六'),
    'GROUP_3_SUM': (305L, u'三星组选和值'),

    'RANDOM': (306L, u'不定位'),
    'DWD': (307L, u'定位胆'),

    'DIRECT_2': (201L, u'二星直选'),
    'SUM_2': (202L, u'二星直选和值'),

    'GROUP_2': (203L, u'二星组选'),
    'GROUP_2_SUM': (204L, u'二星组选和值'),
    'BSOE': (205L, u'大小单双'),
})

TC_THREE_BET_CATEGORY_TYPE = [
    (TC_THREE_BET_CATEGORY.THREE, [BET_TYPE.DIRECT_3, BET_TYPE.SUM_3, BET_TYPE.GROUP_3, BET_TYPE.GROUP_6, BET_TYPE.GROUP_3_SUM, BET_TYPE.RANDOM, BET_TYPE.DWD]),
    (TC_THREE_BET_CATEGORY.TWO, [BET_TYPE.DIRECT_2, BET_TYPE.SUM_2, BET_TYPE.GROUP_2, BET_TYPE.GROUP_2_SUM, BET_TYPE.BSOE]),
]

BET_TYPE_DESC = {
    BET_TYPE.DIRECT_3: u"所选号码与开奖号码的百位、十位、个位相同，且顺序一致，即为中奖",
    BET_TYPE.SUM_3: u"所选数值等于开奖号码百位、十位、个位三个数字相加之和，即为中奖",
    BET_TYPE.GROUP_3: u"从0-9中选择2个数字组成两注，所选号码与开奖号码的百位、十位、个位号码相同，顺序不限，即为中奖",
    BET_TYPE.GROUP_6: u"从0-9中任意选择3个号码组成一注，所选号码与开奖号码的百位、十位、个位号码相同，顺序不限，即为中奖",
    BET_TYPE.GROUP_3_SUM: u"所选数值等于开奖号码百位、十位、个位数字相加之和(不含豹子号)，即为中奖",
    BET_TYPE.RANDOM: u"所选号码与开奖号码的百位、十位、个位当中的某一个数字相同，即为中奖",
    BET_TYPE.DIRECT_2: u"从十位、个位中选择一个2位数号码组成一注，所选号码与开奖号码的十位、个位相同，且顺序一致，即为中奖",
    BET_TYPE.SUM_2: u"所选数值等于开奖号码的十位、个位二个数字相加之和，即为中奖",
    BET_TYPE.GROUP_2: u"从0-9中选2个号码组成一注，所选号码与开奖号码的十位、个位相同，顺序不限（不含对子号），即为中奖",
    BET_TYPE.GROUP_2_SUM: u"所选数值等于开奖号码的十位、个位二个数字相加之和（不含对子号），即为中奖",
    BET_TYPE.DWD: u"任意位置上至少选择1个以上号码，所选号码与相同位置上的开奖号码一致，即为中奖",
    BET_TYPE.BSOE: u"对十位和个位的“大（56789）小（01234）、单（13579）双（02468）”形态进行购买，所选号码的位置、形态与开奖号码的位置、形态相同，即为中奖"
}


def get_avaliable_bet_types():
    _list = []
    for category, bet_types in TC_THREE_BET_CATEGORY_TYPE:
        type_list = []
        _id = 1
        for bet_type in bet_types:
            type_list.append({
                'id': _id,
                'title': BET_TYPE.get_label(bet_type),
                'play_id': bet_type,
                'des': BET_TYPE_DESC[bet_type],
                'rule': '',
                'support': 1
            })
            _id += 1
        data = {
            'id': category,
            'title': TC_THREE_BET_CATEGORY.get_label(category),
            'support': 1,
            'list': type_list
        }
        _list.append(data)
    return _list


class TC_PLS_Activity(object):
    id = orm.Column(orm.Integer, primary_key=True)
    term = orm.Column(orm.VARCHAR)  # 期号
    number = orm.Column(orm.VARCHAR)  # 开奖结果
    reference = orm.Column(orm.TEXT)  # 爬取结果页url
    status = orm.Column(orm.SmallInteger)  # 状态
    start_ts = orm.Column(orm.Integer)  # 我方开始时间戳（整点）
    end_ts = orm.Column(orm.Integer)  # 我方结束时间戳（略早于官方）
    announce_ts = orm.Column(orm.Integer)  # 爬取到结果的时间戳
    created_at = orm.Column(orm.DATETIME)
    updated_at = orm.Column(orm.DATETIME)


class TC_PLS_Trend(object):
    '''     五星基本走势，每位（个十百千万）各占一个字段，类型是字符串，
            格式是用逗号分隔的遗漏次数。如果当期出现，遗漏次数为0. 由于
            这玩意儿理论上可以无限前溯，所以最开始的几期里面会出现`x`，表示
            遗漏次数未知。后续其他走势图的部分数据可以直接从这里拿。统计数据不做存储，
            考虑使用redis进行cache，或者让客户端自己算。

            NOTE: 由于爬虫的结果是乱序的，不能保证开奖的顺序是递增的。这里在插入数据的时候，
            要考虑到这个问题。
    '''
    id = orm.Column(orm.Integer, primary_key=True)
    term = orm.Column(orm.VARCHAR)
    number = orm.Column(orm.VARCHAR)
    # 每一位遺漏的次數
    idx_0 = orm.Column(orm.VARCHAR)
    idx_1 = orm.Column(orm.VARCHAR)
    idx_2 = orm.Column(orm.VARCHAR)

    @classmethod
    def get_defaults(cls):
        data = {}
        for k in range(3):
            data['idx_%s' % k] = ','.join('x' * 10)

        return data

    def get_stat(self, bet_type):
        ''' 根据玩法返回统计（遗漏、最大）数据
            这个数据应该被缓存起来（因为冷热和最大需要实时计算）
            对于每一期而言，这个数据是固定的
        '''
        resp = {}
        return resp
